#!/bin/bash
# Feprima.
# Script para procesar las facturas recibidas y aceptarlas o rechazarlas
# mediante una validacion de formato y existencia de proveedores.
# Valores de retorno:
# 	0: ejecucion exitosa.
# 	1: feprima.sh ya esta ejecutandose.
# 	2: sistema no inicializado.

# Variables utilizadas dentro del script.

carpetaRecibidos="$grupo/recibidos"
carpetaAceptados="$grupo/aceptados"
carpetaRechazados="$grupo/rechazados"
nombreScript=`basename "$0"`

# fin variables.

source util.sh

# Funcioines auxiliares.

# Funcion para rechazar un archivo.
# $1 ruta del archivo a rechazar.
function rechazar {
	move.sh "$1" "$carpetaRechazados/"
}

# Funcion para aceptar un archivo.
# $1 ruta del archivo a aceptar.
function aceptar {
	move.sh "$1" "$carpetaAceptados/"
}

# Funcion para dar formato de numero con dos decimales un numero.
# $1 numero a formatear.
function formatoPuntoFlotante {
	e=`echo "$1" | grep ".*\..*"` 
	if [ "$e" = "" ]
	then
		echo "${1}.00"
	else
		echo "$1"
	fi
}

# Funcion para validar los registros de un archivo.
# $1 ruta del archivo a validar.
# $2 importeGravado total del archivo.
# $3 importeNoGravado total del archivo.
# $4 importeTributoIVA total del archivo.
# Devuelve: 0 si el archivo es valido, 1 en caso contrario.
							
function validarRegistros() {

	facturaValida=0

	# Formato del registro.
	# 	1. DescItem - N caracteres.
	# 	2. PrecioItem - N enteros y dos decimales.
	# 	3. tasaIVAItem - N enteros y dos decimales.
	# 	4. montoIVAItem - N enteros y dos decimales.
	registroRegex='^[^;]*;[0-9]*\.[0-9]\{2\};[0-9]*\.[0-9]\{2\};[0-9]*\.[0-9]\{2\}$'

	# Acumuladores de montos.
	accGravado="0.00"
	accNoGravado="0.00"
	accIva="0.00"

	# Nombre del archivo sin ruta.
	nomArch=`echo "$1" | sed 's/^.*\/\(.*\)$/\1/'`

	# Iterar lineas salteando encabecado.
	for linea in `sed 1d "$1"`
	do
		# Verificar formato del registro.
		registroValido=`echo "$linea" | grep "$registroRegex"`

		if [ "$registroValido" != '' ]
		then
			precio=`echo "$linea" | cut -d';' -f2`
			tasaIva=`echo "$linea" | cut -d';' -f3`
			montoIva=`echo "$linea" | cut -d';' -f4`

			# Verificar montos negativos.
			res=`echo "$precio $tasaIva $montoIva" | awk '{if (($1 < 0) || ($2 < 0) || ($3 < 0)) print 0; else print 1}'`
			if [ $res = "0" ]
			then
				# Registro Invalido.
				Glog.sh "$nombreScript" "W" "Factura erronea en registro de item: $nomArch."
				facturaValida=1
				break
			else
				# Verificar la relacion monto / tasa / precio.
				montoCalculado=`echo "scale=2 ; ($precio * $tasaIva / 100)" | bc`
				res=`echo "$montoCalculado $montoIva" | awk '{if ($1 != $2) print 0; else print 1}'`
				if [ $res = "0" ]
				then
					# Condicion no cumplida.
					Glog.sh "$nombreScript" "W" "Factura erronea en registro de item: $nomArch."
					facturaValida=1
					break
				else
					# Actualizar acumulados.
					if [ "$tasaIva" != "0.00" ]
					then
						accGravado=`echo "scale=2 ; $accGravado + $precio" | bc`
					fi

					if [ "$tasaIva" = "0.00" ]
					then
						accNoGravado=`echo "scale=2 ; $accNoGravado + $precio" | bc`
					fi

					accIva=`echo "scale=2 ; $accIva + $montoIva" | bc`
				fi
			fi
		else
			# Registro Invalido.
			Glog.sh "$nombreScript" "W" "Factura erronea en registro de item: $nomArch."
			facturaValida=1
			break
		fi
	done
	# Validar acumulados.
	fAccGravado=`formatoPuntoFlotante $accGravado`
	fAccNoGravado=`formatoPuntoFlotante $accNoGravado`
	fAccIva=`formatoPuntoFlotante $accIva`

	res=`echo "$fAccGravado $fAccNoGravado $fAccIva $2 $3 $4" | awk '{if (($1 != $4) || ($2 != $5) || ($3 != $6)) print 0; else print 1}'`
	if [ "$res" = "0" ]
	then
		Glog.sh "$nombreScript" "W" "Factura Erronea no coinciden los totales: $nomArch."
		facturaValida=1
	fi

	return $facturaValida
}
# fin funciones.

# Inicio de la ejecucion.

if [ $# -gt 1 ]
then
	eko "Parametros pasados a Feprima ignorados. No se necesitan parametros para la ejecucion."
fi

# Verificar si existe otro feprima corriendo.
estoyEjecutandome $nombreScript
if [ `echo $?` -eq "1" ]
then
	# Verificar si el sistema esta inicializado.
	if [ ! -z $FEENV ]
	then
		cantArch=`ls -1 "$carpetaRecibidos" | wc -l`
		Glog.sh "$nombreScript" "I" "Inicio de Feprima: $cantArch."

		# Procesar archivos.
		for arch in `ls "$carpetaRecibidos"`
		do
			Glog.sh "$nombreScript" "I" "Archivo a procesar: $arch."

			# Verificar que no sea un CAE duplicado.
			duplicado=`ls "$carpetaAceptados" | grep "^$arch"`
			if [ "$duplicado" != '' ]
			then
				# Factura ya ingresada.
				rechazar "$carpetaRecibidos/$arch"
				Glog.sh "$nombreScript" "W" "Factura duplicada: $arch."
			else
				# Validar formato de registro cabecera.
				# 	1. CUITProveedor - 11 digitos.
				# 	2. codigoTipoComprobante - A, B, C o E.
				# 	3. numeroPuntoVenta - 0001-9998.
				# 	4. numeroComprobante - 00000001-99999998.
				# 	5. fechaFactura - Fecha.
				# 	6. fechaVencimientoCAE - Fecha.
				# 	7. importeNoGravado - N enteros y dos decimales.
				# 	8. importeGravado - N enteros y dos decimales.
				# 	9. importeTributoIVA - N enteros y dos decimales.
				# 	10. ImporteTotal - N enteros y dos decimales.
				cabeceraRegex='^[0-9]\{11\};[A-C,E];[0-9]\{4\};[0-9]\{8\};[0-9]\{4\}\-[0-1][0-9]\-[0-3][0-9];[0-9]\{4\}\-[0-1][0-9]\-[0-3][0-9];[0-9]*\.[0-9]\{2\};[0-9]*\.[0-9]\{2\};[0-9]*\.[0-9]\{2\};[0-9]*\.[0-9]\{2\}$'

				cabeceraArchivo=`head -1 "$carpetaRecibidos/$arch"`
				cabeceraValida=`echo "$cabeceraArchivo" | grep "$cabeceraRegex"`

				# Verificar los valores especiales para los campos numeroPuntoVenta y numeroComprobante.
				numeroPuntoVenta=`echo $cabeceraArchivo | cut -d';' -f3`
				numeroComprobante=`echo $cabeceraArchivo | cut -d';' -f4`

				# Validar las fechas mas alla del formato.
				validarFecha `echo $cabeceraArchivo | cut -d';' -f5`
				fechaFacturaValida=`echo "$?"`
				validarFecha `echo $cabeceraArchivo | cut -d';' -f6`
				fechaVencimientoCaeValida=`echo "$?"`

				if [ "$cabeceraValida" != '' -a "$numeroPuntoVenta" != '0000' -a "$numeroPuntoVenta" != '9999' -a "$numeroComprobante" != '00000000' -a "$numeroComprobante" != '99999999' -a "$fechaFacturaValida" = '0' -a "$fechaVencimientoCaeValida" = '0' ]
				then
					# Validacion de fecha de vencimiento CAE.
					vencCae=`echo "$cabeceraArchivo" | cut -d';' -f6`
					fechaHoy
					compFechas=`compararFechas "$vencCae" "$hoy"`
					if [ "$compFechas" != "1" ]
					then
						# CAE vencido.
						Glog.sh "$nombreScript" "W" "CAE vencido ($vencCae): $arch."
						rechazar "$carpetaRecibidos/$arch"
					else
						# Validar registro cabecera.
						cuitProveedor=`echo "$cabeceraArchivo" | cut -d';' -f1`
						proveedorExiste=`cat "$PROVEEDORES" | cut -d';' -f2 | grep "$cuitProveedor"`

						if [ "$proveedorExiste" != '' ]
						then
							# Validacion de registros.
							importeGravado=`echo $cabeceraArchivo | cut -d';' -f8`
							importeNoGravado=`echo $cabeceraArchivo | cut -d';' -f7`
							importeTributoIVA=`echo $cabeceraArchivo | cut -d';' -f9`

							validarRegistros "$carpetaRecibidos/$arch" "$importeGravado" "$importeNoGravado" "$importeTributoIVA"
							facturaValida="$?"
							if [ "$facturaValida" = "0" ]
							then
								# Generacion de facturas a pagar.
								fechaFactura=`echo $cabeceraArchivo | cut -d';' -f5`
								importeTotal=`echo $cabeceraArchivo | cut -d';' -f10`
								condicionPago=`cat "$PROVEEDORES" | grep "$cuitProveedor" | cut -d';' -f6`
								sumarDias "$fechaFactura" "$condicionPago"
								fechaVencimiento=$fecha

								echo "$arch;A PAGAR;$fechaVencimiento;$importeTotal" >> "$APAGAR"

								# Aceptar factura1
								aceptar "$carpetaRecibidos/$arch"

								Glog.sh "$nombreScript" "W" "Factura aceptada: $arch."
							else
								# Contenido invalido.
								rechazar "$carpetaRecibidos/$arch"
							fi
						else
							# Proveedor inexistente
							rechazar "$carpetaRecibidos/$arch"
							Glog.sh "$nombreScript" "W" "Proveedor inexistente ($cuitProveedor): $arch."
						fi
					fi
				else
					# Cabecera invalida.								
					rechazar "$carpetaRecibidos/$arch"
					Glog.sh "$nombreScript" "W" "Factura Erronea en registro cabecera: $arch."
				fi
			fi
		done
		Glog.sh "$nombreScript" "I" "Fin de Feprima."
		exit 0
	else
		eko "Sistema no inicializado."
		exit 2
	fi
else
	eko "Feprima ya se esta ejecutando."
	exit 1
fi

